Введение
В мае 2020 года компания Bitdefender опубликовала подробный анализ Mandrake — сложной платформы для кибершпионажа, нацеленной на устройства на базе Android, которая оставалась незамеченной минимум четыре года.
В апреле 2024 года мы обнаружили подозрительный образец, который оказался новой версией Mandrake. В ходе анализа мы нашли пять приложений с Mandrake, которые были доступны в магазине Google Play с 2022 по 2024 год, установлены в общей сложности более 32 000 раз и при этом не были обнаружены ни одним защитным решением. Новые образцы содержат новые уровни обфускации и методы обхода средств защиты: перемещение вредоносной функциональности в обфусцированные нативные библиотеки, использование закрепления сертификатов для связи с командным сервером и выполнение широкого спектра проверок того, запущен ли Mandrake на рутованном устройстве или в эмулированной среде.
Наши выводы в двух словах:
- Android-шпион Mandrake вернулся в Google Play спустя два года и оставался незамеченным еще два года;
- злоумышленники перенесли основную вредоносную функциональность в нативные библиотеки, обфусцированные с помощью OLLVM;
- связь с командными серверами (C2) осуществляется с использованием закрепления сертификатов для предотвращения перехвата SSL-трафика;
- Mandrake содержит множество методов обхода песочниц и защиты от анализа.
Продукты «Лаборатории Касперского» детектируют эту угрозу как HEUR:Trojan-Spy.AndroidOS.Mandrake.*.
Технические подробности
Предыстория
Первую кампанию Mandrake, состоявшую из двух крупных волн (2016–2017 и 2018–2020 годы), в мае 2020 года проанализировала компания Bitdefender. После публикации их отчета мы обнаружили еще один образец, связанный с этой кампанией, который все еще был доступен в магазине Google Play.
В апреле 2024 года мы обнаружили подозрительный образец, который оказался новой версией Mandrake. Его основной отличительной особенностью стало добавление дополнительных уровней обфускации для обхода проверок Google Play и усложнения анализа. Мы обнаружили пять приложений, содержащих Mandrake, с общим числом загрузок более 32 000. Все они были размещены в магазине Google Play в 2022 году и оставались доступными для скачивания не менее года. Последнее из этих приложений в последний раз обновлялось 15 марта 2024 года и было удалено из Google Play позднее в том же месяце. По данным VirusTotal на июль 2024 года, ни одно защитное решение не выявило вредоносный характер ни одного из этих приложений.
Приложения
Имя пакета | Имя приложения | MD5 | Разработчик | Дата публикации | Дата последнего обновления на Google Play | Число загрузок |
com.airft.ftrnsfr | AirFS | 33fdfbb1acdc226eb177eb42f3d22db4 | it9042 | 28 апреля 2022 г. |
15 марта 2024 г. |
30 305 |
com.astro.dscvr | Astro Explorer | 31ae39a7abeea3901a681f847199ed88 | shevabad | 30 мая 2022 г. |
6 июня 2023 г. |
718 |
com.shrp.sght | Amber | b4acfaeada60f41f6925628c824bb35e | kodaslda | 27 февраля 2022 г. |
19 августа 2023 г. |
19 |
com.cryptopulsing.browser | CryptoPulsing | e165cda25ef49c02ed94ab524fafa938 | shevabad | 2 ноября 2022 г. |
6 июня 2023 г. |
790 |
com.brnmth.mtrx | Brain Matrix | — | kodaslda | 27 апреля 2022 г. |
6 июня 2023 г. |
259 |
Нам не удалось получить APK-файл приложения com.brnmth.mtrx, однако, учитывая разработчика и дату публикации, мы с высокой долей уверенности предполагаем, что оно содержало шпионское ПО Mandrake.
Вредоносный имплант
В этом отчете мы сосредоточимся главным образом на приложении AirFS, которое было доступно в магазине Google Play в течение двух лет, последний раз обновлялось 15 марта 2024 года и имело наибольшее число загрузок (более 30 000). Согласно описанию, приложение якобы предназначалось для обмена файлами.
При этом, судя по отзывам, некоторые пользователи заметили, что оно не работает или крадет данные устройства.
Цепочка заражения
Приложения, относящиеся к последней кампании, работают поэтапно: дроппер, загрузчик и ядро — так же как и предыдущие версии Mandrake, описанные в отчете Bitdefender. Однако в отличие от предыдущей кампании, в которой вредоносная логика первого этапа (дроппер) находилась в файле .dex приложения, новые версии всю вредоносную активность первого этапа скрывают внутри нативной библиотеки libopencv_dnn.so, проанализировать которую и обнаружить вредоносное ПО сложнее, чем в случае файлов .dex. Эта библиотека экспортирует функции для расшифровки следующего этапа (загрузчика) из папки assets/raw.
Интересно отметить, что образец com.shrp.sght состоит всего из двух этапов: функции загрузчика и ядра совмещены в одном APK-файле, который дроппер расшифровывает из папки ресурсов.
В то время как в предыдущих кампаниях Mandrake наблюдались разные ветви версий (oxide, briar, ricinus, darkmatter), нынешняя кампания связана только с ветвью ricinus. Имена файлов второго и третьего этапов — ricinus_airfs_3.4.0.9.apk, ricinus_dropper_core_airfs_3.4.1.9.apk, ricinus_amber_3.3.8.2.apk и так далее.
При запуске приложения загружается нативная библиотека:
Чтобы затруднить обнаружение шпиона, нативная библиотека первого этапа сильно обфусцирована с помощью обфускатора OLLVM. Ее основная задача — расшифровка и загрузка второго этапа (загрузчика). Когда файл .dex второго этапа распакован, расшифрован и загружен в память, вызывается метод dex_load и выполняет его. В методе dex_load путь к нативной библиотеке второго этапа добавляется в загрузчик классов и запускаются основные действия и служба второго этапа. В этот момент приложение выводит запрос разрешения на отображение поверх других приложений.
При запуске основной службы загружается нативная библиотека второго этапа libopencv_java3.so и выполняется расшифровка сертификата для связи с командным сервером. Сертификат находится в папке ресурсов второго этапа. Для связи с командным сервером злоумышленники использовали IP-адрес, а если соединение не устанавливалось, то вредоносная программа пыталась подключиться к ряду доменов. После установления соединения на командный сервер отправляется информация об устройстве, включая список установленных приложений, данные о мобильной сети, IP-адрес и уникальный идентификатор устройства. Если, исходя из этой информации, злоумышленники находят жертву интересной, в приложение возвращается команда на загрузку и запуск «ядра» — основного компонента Mandrake. В этом случае запускается третий этап: загрузка, расшифровка и выполнение ядра. Этот этап содержит основные функции вредоносного ПО.
Команды второго этапа:
Команда | Описание |
start | Запуск активности |
cup | Блокировка перехода в режим сна, включение Wi-Fi и запуск главной родительской службы |
cdn | Запуск главной службы |
stat | Сбор сведений о состоянии подключения, оптимизации работы аккумулятора, разрешении отображения поверх других приложений, состоянии Android Debug Bridge, внешнем IP-адресе и версии Google Play |
apps | Сообщение об установленных приложениях |
accounts | Сообщение об учетных записях пользователя |
battery | Сообщение об уровне заряда батареи |
home | Запуск приложения-лаунчера |
hide | Скрытие значка лаунчера |
unload | Восстановление значка лаунчера |
core | Запуск загрузки ядра |
clean | Удаление загруженного ядра |
over | Вывод запроса на разрешение отображения поверх других приложений |
opt | Предоставление приложению разрешения на работу в фоновом режиме |
Команды третьего этапа:
Команда | Описание |
start | Запуск активности |
duid | Изменение UID |
cup | Блокировка перехода в режим сна, включение Wi-Fi и запуск главной родительской службы |
cdn | Запуск главной службы |
stat | Сбор сведений о состоянии подключения, оптимизации работы аккумулятора, разрешении отображения поверх других приложений, состоянии Android Debug Bridge, внешнем IP-адресе и версии Google Play |
apps | Сообщение об установленных приложениях |
accounts | Сообщение об учетных записях пользователя |
battery | Сообщение об уровне заряда батареи |
home | Запуск приложения-лаунчера |
hide | Скрытие значка лаунчера |
unload | Восстановление значка лаунчера |
restart | Перезапуск приложения |
apk | Вывод уведомления об установке приложения |
start_v | Запуск трансляции экрана с удаленным доступом, которую злоумышленники называют «VNC» |
start_a | Запуск веб-представления (webview) с наложением с использованием автоматизации |
stop_v | Остановка веб-представления с наложением |
start_i, start_d | Запуск веб-представления с наложением с записью экрана |
stop_i | Остановка веб-представления с наложением |
upload_i, upload_d | Передача записи экрана |
over | Вывод запроса на разрешение отображения поверх других приложений |
opt | Предоставление приложению разрешения на работу в фоновом режиме |
Когда Mandrake получает команду start_v, запускается служба, которая загружает указанный URL-адрес в окно веб-представления приложения со специальным интерфейсом на JavaScript. Этот интерфейс приложение использует для операций с загруженной веб-страницей.
Пока страница загружается, приложение устанавливает соединение через WebSocket и начинает периодически делать скриншоты страницы, кодировать их в строки Base64 и отправлять на командный сервер. Частоту и качество кадров злоумышленники могут регулировать с помощью дополнительных команд. Эту процедуру авторы шпиона назвали «vnc_stream». В то же время командный сервер может возвращать приложению управляющие команды, вызывающие такие действия, как прокрутка до указанной координаты, изменение размера и разрешения окна веб-представления, изменение режима отображения страницы (для компьютеров или мобильных устройств), включение или отключение выполнения JavaScript, изменение User Agent, импорт или экспорт файлов cookie, переход назад и вперед, обновление и масштабирование загруженной страницы и так далее.
Когда Mandrake получает команду start_i, URL-адрес также загружается в окно веб-представления, но вместо запуска потока «VNC» командный сервер начинает запись экрана и сохраняет ее в файл. При этом процесс записи работает так же, как «VNC», но скриншоты сохраняются в видеофайл. Также в этом режиме приложение ожидает, пока пользователь введет свои учетные данные на загруженной веб-странице, а затем собирает файлы cookie из окна веб-представления.
Команда start_a позволяет запускать автоматизированные действия (прокрутка, нажатие и так далее) в контексте загруженной страницы. Для этого Mandrake скачивает сценарии автоматизации с URL-адреса, указанного в аргументах при запуске. В этом режиме также производится запись экрана.
Команды upload_i и upload_d отправляют записи экрана на командный сервер.
Главные цели Mandrake — кража учетных данных пользователя, а также загрузка и выполнение вредоносных приложений следующего этапа.
Методы расшифровки данных
Логика шифрования и расшифровки данных у разных этапов Mandrake одинакова. В этом разделе мы опишем методы расшифровки данных для второго этапа.
Нативная библиотека второго этапа libopencv_java3.so содержит зашифрованные с помощью алгоритма AES домены командного сервера и ключи для расшифровки данных конфигурации и полезной нагрузки. Зашифрованные строки перемешаны со строками обычного текста.
Чтобы получить длину строки, Mandrake выполняет операцию XOR над первыми тремя байтами зашифрованного массива, а затем первые два байта используются в качестве ключей для кастомного XOR-шифрования.
Ключ и вектор инициализации для расшифровки данных, зашифрованных алгоритмом AES, кодируются таким же образом. Часть данных дополнительно подвергается операции XOR с константами.
Для расшифровки AES используется библиотека OpenSSL, однако способ ее применения весьма необычен. Зашифрованный файл делится на блоки размером 16 байт, каждый из которых расшифровывается с помощью алгоритма AES-CFB128.
Зашифрованный сертификат для связи с командным сервером находится в папке assets/raw второго этапа под именем cart.raw и расшифровывается по тому же алгоритму.
Установка приложений следующего этапа
Когда командный сервер отправляет команду apk, Mandrake скачивает новый отдельный APK-файл с дополнительным модулем и показывает пользователю уведомление, маскируясь под Google Play. Если пользователь нажимает на уведомление, начинается процесс установки.
В Android 13 появилась функция «Настройки с ограниченным доступом», которая запрещает приложениям, загруженным не из официального магазина, напрямую запрашивать опасные разрешения. Чтобы обойти эту функцию, установка выполняется с помощью «сеансового» установщика пакетов.
Методы обхода песочницы и проверки среды
Хотя основная цель приложений Mandrake та же, что и в предыдущих кампаниях, в новых версиях код усложнился, а количество проверок эмуляции с целью предотвратить выполнение в среде для анализа значительно увеличилось. Однако нам удалось обойти эти ограничения и обнаружить следующие изменения.
Версии вредоносной программы, обнаруженные ранее, содержали лишь базовую процедуру проверки эмуляции.
В новой версии мы обнаружили дополнительные проверки.
Прежде всего, злоумышленники добавили обнаружение Frida. При запуске приложения загружается нативная библиотека первого этапа libopencv_dnn.so. Вызов функции обнаружения Frida содержится в разделе init_array этой библиотеки. В качестве основной логики обнаружения злоумышленники использовали метод DetectFrida. В нем сначала вычисляется контрольная сумма CRC всех библиотек, а затем запускается поток обнаружения Frida. Каждые пять секунд он проверяет, не были ли изменены библиотеки в памяти. Кроме того, наличие Frida определяется по конкретным именам потоков и каналов, которые использует этот инструмент. Таким образом, когда аналитик пытается использовать Frida для изучения и отладки приложения, выполнение приложения прекращается. Даже если запустить кастомную сборку инструмента, при попытке перехватить функцию из нативной библиотеки приложение обнаружит изменение кода и завершит работу.
Далее, когда собирается информация об устройстве для запроса о запуске следующего этапа, приложение проверяет среду, чтобы выяснить, имеет ли устройство root-права и установлены ли на нем средства аналитики. В отличие от некоторых других злоумышленников, которые стремятся воспользоваться root-доступом, разработчики Mandrake считают рутованные устройства опасными, поскольку обычные пользователи, которые их интересуют, как правило, не рутуют свои телефоны. Сначала Mandrake пытается найти файлы su binary, SuperUser.apk, Busybox, Xposed Framework, Magisk и Saurik Substrate. Затем проверяет, не смонтирован ли системный раздел в режиме «только для чтения». После этого — не включены ли настройки разработчика и Android Debug Bridge. И наконец, проверяет наличие на устройстве учетной записи Google и приложения Google Play.
Взаимодействие с командным сервером
Весь обмен данными с командным сервером осуществляется в нативной части приложений с использованием скомпилированной статической библиотеки OpenSSL.
Чтобы предотвратить прослушивание сетевого трафика, Mandrake содержит зашифрованный сертификат (который расшифровывается из папки assets/raw) и использует его для защиты обмена данными с командным сервером. Клиент обязательно проверяется этим сертификатом, поэтому попытка перехвата SSL-трафика приводит к сбою установления связи между приложением и командным сервером, а также к прерыванию обмена данными. Однако все пакеты, отправляемые на командный сервер, сохраняются локально для дополнительного AES-шифрования, что позволяет изучить содержимое сообщений. Mandrake использует собственный JSON-подобный формат сериализации — тот же самый, что и в предыдущих кампаниях.
Пример запроса к командному серверу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
node #1 { uid "a1c445f10336076b"; request "1000"; data_1 "32|3.1.1|HWLYO-L6735|26202|de||ricinus_airfs_3.4.0.9|0|0|0||0|0|0|0|Europe/Berlin||180|2|1|41|115|0|0|0|0|loader|0|0|secure_environment||0|0|1|0||0|85.214.132.126|0|1|38.6.10-21 [0] [PR] 585796312|0|0|0|0|0|"; data_2 "loader"; dt 1715178379; next #2; } node #2 { uid "a1c445f10336076b"; request "1010"; data_1 "ricinus_airfs_3.4.0.9"; data_2 ""; dt 1715178377; next #3; } node #3 { uid "a1c445f10336076b"; request "1003"; data_1 "com.airft.ftrnsfr\n\ncom.android.calendar\n\[redacted]\ncom.android.stk\n\n"; data_2 ""; dt 1715178378; next NULL; } |
Пример ответа командного сервера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
node #1 { response "a1c445f10336076b"; command "1035"; data_1 ""; data_2 ""; dt "0"; next #2; } node #2 { response "a1c445f10336076b"; command "1022"; data_1 "20"; data_2 "1"; dt "0"; next #3; } node #3 { response "a1c445f10336076b"; command "1027"; data_1 "1"; data_2 ""; dt "0"; next #4; } node #4 { response "a1c445f10336076b"; command "1010"; data_1 "ricinus_dropper_core_airfs_3.4.1.9.apk"; data_2 "60"; dt "0"; next NULL; } |
Mandrake использует операционные коды от 1000 до 1058. Один и тот же операционный код в запросе и ответе может означать разные действия. Например:
- операционный код запроса 1000: отправка данных устройства;
- операционный код запроса 1003: отправка списка установленных приложений;
- операционный код запроса 1010: отправка информации о компоненте;
- операционный код ответа 1002: настройка частоты обмена данными между клиентом и сервером;
- операционный код ответа 1010: установка APK следующего этапа;
- операционный код ответа 1011: прерывание установки следующего этапа;
- операционный код ответа 1022: запрос пользователю на разрешение выполнения в фоновом режиме;
- операционный код ответа 1023: прерывание запроса пользователю на разрешение выполнения в фоновом режиме;
- операционный код ответа 1027: изменение значка приложения на значок по умолчанию или значок службы Wi-Fi.
Атрибуция
Учитывая сходство текущей кампании с предыдущей и то, что домены командного сервера зарегистрированы в России, мы с высокой долей уверенности предполагаем, что за этой кампанией стоят злоумышленники, упомянутые в отчете компании Bitdefender.
Жертвы
Вредоносные приложения в Google Play были доступны во множестве стран. Большинство загрузок приходились на Канаду, Германию, Италию, Мексику, Испанию, Перу и Великобританию.
Выводы
Шпионская программа Mandrake постоянно развивается, совершенствуя методы маскировки, обхода песочницы и новых защитных механизмов. Первые версии оставались незамеченными на протяжении четырех лет. Нынешнюю кампанию обнаружили только спустя два года, и все это время вредоносное ПО было доступно для скачивания в Google Play. Это свидетельствует о высокой квалификации злоумышленников, а также о том, что усиление ограничений и проверок приложений перед их публикацией в маркетах приводит к усложнению угроз, проникающих в официальные магазины приложений, и затруднению их обнаружения.
Индикаторы компрометации
Хэш-суммы файлов
141f09c5d8a7af85dde2b7bfe2c89477
1b579842077e0ec75346685ffd689d6e
202b5c0591e1ae09f9021e6aaf5e8a8b
31ae39a7abeea3901a681f847199ed88
33fdfbb1acdc226eb177eb42f3d22db4
3837a06039682ced414a9a7bec7de1ef
3c2c9c6ca906ea6c6d993efd0f2dc40e
494687795592106574edfcdcef27729e
5d77f2f59aade2d1656eb7506bd02cc9
79f8be1e5c050446927d4e4facff279c
7f1805ec0187ddb54a55eabe3e2396f5
8523262a411e4d8db2079ddac8424a98
8dcbed733f5abf9bc5a574de71a3ad53
95d3e26071506c6695a3760b97c91d75
984b336454282e7a0fb62d55edfb890a
a18a0457d0d4833add2dc6eac1b0b323
b4acfaeada60f41f6925628c824bb35e
cb302167c8458e395337771c81d5be62
da1108674eb3f77df2fee10d116cc685
e165cda25ef49c02ed94ab524fafa938
eb595fbcf24f94c329ac0e6ba63fe984
f0ae0c43aca3a474098bd5ca403c3fca
Домены и IP-адреса
45.142.122[.]12
ricinus[.]ru
ricinus-ca[.]ru
ricinus-cb[.]ru
ricinus-cc[.]ru
ricinus[.]su
toxicodendron[.]ru
Шпион Mandrake снова прокрался в Google Play и два года оставался незамеченным